/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2009，所有权利保留。
 * 
 * 项目名：	rumba-web
 * 文件名：	RActionBase.java
 * 模块说明：	
 * 修改历史：
 * Jan 8, 2009 - lxm - 创建。
 */
package com.hd123.rumba.gwt.widget2.client.action;

import com.google.gwt.dom.client.Document;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DomEvent;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.HasCaption;
import com.google.gwt.user.client.ui.ListenerWrapper;
import com.google.gwt.user.client.ui.Widget;
import com.hd123.rumba.gwt.widget2.client.hotkey.HasRHotKey;
import com.hd123.rumba.gwt.widget2.client.hotkey.RHotKey;
import com.hd123.rumba.gwt.widget2.client.hotkey.RHotKeyManager;
import com.hd123.rumba.gwt.widget2.client.misc.RImageLocation;

/**
 * 界面动作控件的基类。
 * <p>
 * 
 * 其设计被用于按钮、工具栏按钮、菜单项等对应界面操作动作部件。
 * 
 * @author lxm
 * 
 */
@SuppressWarnings("deprecation")
public abstract class RActionBase extends Widget implements HasCaption, HasClickHandlers,
    HasRHotKey {

  private String caption = "";
  private boolean enabled = true;
  private String title = null;
  private RImageLocation icon;
  private RImageLocation disabledIcon;
  private RHotKey hotKey;

  /** 标题。支持html。 */
  public String getCaption() {
    return caption;
  }

  public void setCaption(String caption) {
    this.caption = caption;
    applyToControls();
  }

  /** 是否处于可用状态。 */
  public boolean isEnabled() {
    return enabled;
  }

  public void setEnabled(boolean enabled) {
    this.enabled = enabled;
    applyToControls();
  }

  /** tool-tip。 */
  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  /** 默认图标 */
  public RImageLocation getIcon() {
    return icon;
  }

  public void setIcon(RImageLocation icon) {
    this.icon = icon;
    applyToControls();
  }

  /** 当动作部件不可用的时候显示的图标。null表示等于icon。 */
  public RImageLocation getDisabledIcon() {
    return disabledIcon;
  }

  public void setDisabledIcon(RImageLocation disabledIcon) {
    this.disabledIcon = disabledIcon;
    applyToControls();
  }

  /**
   * @deprecated 被{@link #addClickHandler(ClickHandler)}替代。
   */
  public void addListener(ClickListener listener) {
    ListenerWrapper.WrappedClickListener.add(this, listener);
  }

  /**
   * @deprecated 被{@link #addClickHandler(ClickHandler)}返回的
   *             {@link HandlerRegistration#removeHandler()}替代。
   */
  public void removeListener(ClickListener listener) {
    ListenerWrapper.WrappedClickListener.remove(this, listener);
  }

  public HandlerRegistration addClickHandler(ClickHandler handler) {
    return addDomHandler(handler, ClickEvent.getType());
  }

  public void fireClick() {
    if (isEnabled())
      DomEvent.fireNativeEvent(Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false,
          false), this);
  }

  public RHotKey getHotKey() {
    return hotKey;
  }

  public void setHotKey(RHotKey hotKey) {
    if (this.hotKey == hotKey)
      return;

    this.hotKey = hotKey;
    RHotKeyManager.remove(this);
    if (this.hotKey != null) {
      RHotKeyManager.add(this.hotKey, this, new Command() {
        public void execute() {
          if (enabled)
            fireClick();
        }
      });
    }
  }

  public void clearHotKey() {
    setHotKey(null);
  }

  /**
   * 应用到所有关联控件。
   */
  protected abstract void applyToControls();

}
